#pragma once
#include <string>

#include "PocelainMacro.h"
POCELAIN_NAMESPACE_BEGIN

// POCELAIN default number type is float
typedef float Real;
typedef double Double;

// POCELAIN default string type is std::string
typedef std::string String;

template <class T> struct TMathUtils;

template <class T> struct TSpherical;

template <class T> struct TEuler;

template <class T> struct TQuaternion;

template <class T> struct TSphere;

template <class T> struct TPlane;

template <class T> struct TTriangle;

template <class T> struct TColor;

template <class T> struct TFrustum;

template <class T, size_t dimension> struct TVector;

template <class T, size_t dimension> struct TBox;

template <class T, size_t dimension> struct TLine;

template <class T, size_t rowNum, size_t colNum> struct TMatrix;

typedef TMathUtils<Real> MathUtils;
typedef TSpherical<Real> Spherical;

typedef TVector<Real, 2> Vector2;
typedef TVector<Real, 3> Vector3;
typedef TVector<Real, 4> Vector4;

typedef TVector<Double, 2> DVector2;
typedef TVector<Double, 3> DVector3;
typedef TVector<Double, 4> DVector4;

typedef TVector<int, 2> IVector2;
typedef TVector<int, 3> IVector3;
typedef TVector<int, 4> IVector4;

typedef TVector<uint32_t, 2> UVector2;
typedef TVector<uint32_t, 3> UVector3;
typedef TVector<uint32_t, 4> UVector4;

// typedef TVector<bool, 2> BVector2;
// typedef TVector<bool, 3> BVector3;
// typedef TVector<bool, 4> BVector4;

typedef TMatrix<Real, 2, 2> Matrix2;
typedef TMatrix<Real, 2, 3> Matrix2x3;
typedef TMatrix<Real, 2, 4> Matrix2x4;
typedef TMatrix<Real, 3, 2> Matrix3x2;
typedef TMatrix<Real, 3, 3> Matrix3;
typedef TMatrix<Real, 3, 4> Matrix3x4;
typedef TMatrix<Real, 4, 2> Matrix4x2;
typedef TMatrix<Real, 4, 3> Matrix4x3;
typedef TMatrix<Real, 4, 4> Matrix4;

typedef TMatrix<Double, 2, 2> DMatrix2;
typedef TMatrix<Double, 2, 3> DMatrix2x3;
typedef TMatrix<Double, 2, 4> DMatrix2x4;
typedef TMatrix<Double, 3, 2> DMatrix3x2;
typedef TMatrix<Double, 3, 3> DMatrix3;
typedef TMatrix<Double, 3, 4> DMatrix3x4;
typedef TMatrix<Double, 4, 2> DMatrix4x2;
typedef TMatrix<Double, 4, 3> DMatrix4x3;
typedef TMatrix<Double, 4, 4> DMatrix4;

typedef TQuaternion<Real> Quaternion;

typedef TEuler<Real> Euler;

typedef TLine<Real, 3> Line3;

typedef TBox<Real, 2> Box2;
typedef TBox<Real, 3> Box3;

typedef TSphere<Real> Sphere;
typedef TTriangle<Real> Triangle;
typedef TPlane<Real> Plane;

typedef TColor<Real> Color;
typedef TFrustum<Real> Frustum;
POCELAIN_NAMESPACE_END
